<?php
namespace SimplePhp\Dispatcher;
use SimplePhp\System as sys;

/**
 *
 */
class Request {
	private static $response_save = [];

	/**
	 * 合并请求参数保存到静态区域
	 * @return [type] [description]
	 */
	public static function response() {
		if (!empty(Request::$response_save)) {
			return Request::$response_save;
		}
		$response_merge = array_merge($_GET, $_POST);
		foreach ($response_merge as $key => $value) {
			Request::$response_save[$key] = htmlspecialchars(get_magic_quotes_gpc() ? $value : addslashes($value));
		}
		return Request::$response_save;
	}
	public static function get($key) {
		return @htmlspecialchars(get_magic_quotes_gpc() ? $_GET[$key] : addslashes($_GET[$key]));
	}
	public static function post($key) {
		return @htmlspecialchars(get_magic_quotes_gpc() ? $_POST[$key] : addslashes($_POST[$key]));
	}
	/**
	 * 映射用户反馈的数据到controller中
	 * 如果controller中的参数是一个实体类
	 * 那么我们可以通过这种方式来进行自动赋值
	 * 比如实体类是user
	 * www.xxx.com?user.name=ying&user.password=1234
	 * [php中吧.转换成了_]
	 * 那么user_name就会赋值到user实体中的name字段
	 * @param  \ReflectionMethod $NodeReflectMathod [description]
	 * @return [type]                               [返回解析完成的数据]
	 */
	public static function mapParameters(\ReflectionMethod $NodeReflectMathod) {
		$args = [];
		$Parameters = $NodeReflectMathod->getParameters();
		$response = Request::response();
		$response = (new PointParseRequest())->parse($response);
		if (count($response) <= 0) {
			return null;
		}
		$response_key = array_keys($response);
		foreach ($Parameters as $key => $value) {
			//参数必须是内置类型或者是类类型，不能是callback
			// var_dump($value->getPosition());
			// var_dump($value->getName());
			// var_dump($value->isArray());
			$parameterName = $value->getName();
			if (in_array($parameterName, $response_key)) {
				//如果是数组就直接吧数据赋值给数组元素
				if ($value->isArray()) {
					$args[] = $response[$parameterName];
				}
				$Context = sys\Context::getInstanct();
				//当php版本是7.0以及以上的时候
				if ($Context->getPhpVersion() == 2) {
					//php版本7可以使用类类型的前缀标示
					//========================================
					if ($value->hasType()) {
						$type = $value->getType();
						// var_dump($type);
					}
				} else {
					$args[] = $response[$parameterName];
				}
			}
		}
		return $args;
	}
}